package org.ei.drishti.service.formSubmission;
import org.ei.drishti.repository.FormDataRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.script.Bindings;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import static java.text.MessageFormat.format;
import static javax.script.ScriptContext.ENGINE_SCOPE;
@Service
public class ZiggyService {
public static final String JAVA_SCRIPT = "JavaScript";
private static Logger logger = LoggerFactory.getLogger(ZiggyService.class.toString());
private static final String SAVE_METHOD_NAME = "createOrUpdateEntity";
private static final String JS_INIT_SCRIPT = "require([\"ziggy/FormDataController\"], function (FormDataController) {\n" +
" controller = FormDataController;\n" +
"});";
private static final String ZIGGY_FILE_LOADER = "ziggyFileLoader";
private static final String REPOSITORY = "formDataRepositoryContext";
private static final String FORM_SUBMISSION_ROUTER = "formSubmissionRouter";
private ZiggyFileLoader ziggyFileLoader;
private FormDataRepository dataRepository;
private FormSubmissionRouter formSubmissionRouter;
private Object ziggyFormController;
private Invocable invocable;
@Autowired
public ZiggyService(ZiggyFileLoader ziggyFileLoader, FormDataRepository dataRepository, FormSubmissionRouter formSubmissionRouter) throws Exception {
this.ziggyFileLoader = ziggyFileLoader;
this.dataRepository = dataRepository;
this.formSubmissionRouter = formSubmissionRouter;
initRhino();
}
public void saveForm(String params, String formInstance) {
try {
invocable.invokeMethod(ziggyFormController, SAVE_METHOD_NAME, params, formInstance);
logger.info(format("Saving form successful, with params: {0}.", params));
logger.debug(format("Saving form successful, with params: {0}, with instance {1}.", params, formInstance));
} catch (Exception e) {
logger.error(format("Form save failed, with params: {0}, with instance {1}. Exception: {2}", params, formInstance, e));
}
}
private void initRhino() throws Exception {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName(JAVA_SCRIPT);
Bindings bindings = getBindings(engine);
engine.setBindings(bindings, ENGINE_SCOPE);
String jsFiles = ziggyFileLoader.getJSFiles();
engine.eval(jsFiles);
engine.eval(JS_INIT_SCRIPT);
ziggyFormController = engine.get("controller");
invocable = (Invocable) engine;
}
private Bindings getBindings(ScriptEngine engine) {
Bindings bindings = engine.createBindings();
bindings.put(ZIGGY_FILE_LOADER, ziggyFileLoader);
bindings.put(REPOSITORY, dataRepository);
bindings.put(FORM_SUBMISSION_ROUTER, formSubmissionRouter);
return bindings;
}
}